//
// Created by twetec on 25-6-19.
//

#ifndef NETWORK_PROBER_SYS_CONFIG_SYS_CONFIG_H
#define NETWORK_PROBER_SYS_CONFIG_SYS_CONFIG_H

#include <string>
#include <yaml-cpp/yaml.h>

#include "interface_conf.h"

namespace network_prober::sys_config
{
class SysConfig
{
public:
    std::string boardSerial();
    std::string productSerial();
    std::string productUUID();
    std::string machineId();
    std::string perceptionIP();
    size_t perceptionPort();
    std::string proberUUID();// 探针唯一标识
    std::string proberVersion();   // 软件版本
    std::string proberPublicModel();   // 公开型号
    std::vector<ProberInterfaceConf> proberInterfaceConfs(); // 网口列表
    std::string proberCPUModel();    // cpu模型
    std::uint8_t proberCPUCores();    // cpu核数
    std::string proberMemoryBytes();    // 内存字节数
    std::string proberDiskBytes();  // 硬盘字节数
    void setProberSecretKey(const std::string& secretKey);
    std::string_view proberSecretKey();
    std::uint8_t proberCPUUsage();  // cpu使用情况
    std::uint8_t proberMemoryUsage();   // 内存使用情况
    std::uint8_t proberDiskUsage(); // 磁盘使用情况
    std::uint32_t proberDiskSpaceGB(); // 磁盘空间 （G）

    void init();                     // 初始化
    static SysConfig &getInstance(); // 获取实例\

private:
    void _initBoardSerial();   // 初始化 /sys/class/dmi/id/board_serial
    void _initProductUUID();    // 初始化 /sys/class/dmi/id/product_uuid
    void _initProductSerial(); // 初始化 /sys/class/dmi/id/product_serial
    void _initMachineId();     // 初始化 /var/lib/dbus/machine-id
    void _initConfigYaml();  // 初始化配置文件
    void _initProberCPUInfo();  // 初始化探针cpu信息

    std::string _SHA256Encrypt(const std::string& text);    // 计算sha256加密值

    SysConfig();  // 构造函数私有化
    ~SysConfig(); // 析构函数私有化

    SysConfig(const SysConfig &) = delete;            // 禁用默认拷贝构造函数（初始化赋值时调用）
    SysConfig &operator=(const SysConfig &) = delete; // 禁用默认拷贝赋值（初始化后，再赋值时调用）

    SysConfig(SysConfig &&) = delete;            // 针对右值
    SysConfig &operator=(SysConfig &&) = delete; // 针对右值

private:
    std::string m_boardSerial;
    std::string m_productSerial;
    std::string m_productUUID;
    std::string m_machineId;
    YAML::Node m_configYaml;
    std::string m_proberUUID;
    std::string m_proberCPUModel;
    std::uint8_t m_proberCPUCores;
    std::string m_proberMemoryBytes;
    std::string m_proberDiskBytes;
    std::string m_proberSecretKey;
};
}

#endif //NETWORK_PROBER_SYS_CONFIG_SYS_CONFIG_H
